反射
import “reflect”
使用ValueOf 函数,创建反射值:
reflectValue:=reflect.ValueOf(i)
通过interface 创建对象
func Create(in interface{}) interface{} {
typeof := reflect.TypeOf(in)
if typeof.Kind() != reflect.Ptr {
panic("no suport")
}
retImpl := reflect.New(typeof.Elem())
return retImpl.Interface()
}
type Test struct {
}
func main(){
test:=Create(&Test{})
t:=test.(*Test{}
if t == nil {
panic("fail")
}
}
遍历Field
如果是struct 类型,可以使用reflect 对struct 进行遍历
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
A string
B string
}
func main() {
a := MyStruct{A: "a", B: "b"}
reflectA := reflect.ValueOf(a)
for i := 0; i < reflectA.NumField(); i++ {
structField := reflectA.Type().Field(i)
fieldValue := reflectA.Field(i)
fmt.Printf("field:%s\n", structField.Name)
fmt.Printf("value:%#v\n", fieldValue.Interface())
}
}
获取Field 的Tag
reflect.ValueOf(mystruct).Type().Field(0).Tag
遍历函数
v := reflect.ValueOf(c)
for i := 0; i < v.NumMethod(); i++ {
method := v.Type().Method(i)
log.Printf("method name:%s\n", method.Name) // 获取方法名
}
调用函数
v := reflect.ValueOf(c)
i:=0
if v.Method(i).Type().NumIn() > 0 {
in := v.Method(i).Type().In(0) // 获取第一个参数(NumIn 获取参数数目)
inArgs := make([]reflect.Value, method.Type().NumIn())
// 如果第一个参数是指针类型
inPut := reflect.New(in.Elem()) // 创建第一个参数实体
in[0]=reflect.ValueOf(inPut)
response := method.Call(in)
log.Printf("response:%#v\n", response)
}
反射有很多坑,但是却可以让你写出更通用,功能更强大、智能的代码,不建议多用,但在改用的时候,还是得用。